﻿using DBUtil.MetaData;

namespace DBUtil.Provider.SqlServer.MetaData;

/// <summary>
/// SqlServer架构
/// </summary>
public class SqlServerSchema : Schema
{
    /// <summary>
    /// 同 select schema_id('dbo') 返回值
    /// </summary>
    public int SchemaId { get; set; }
    /// <summary>
    /// principal_id 是 SQL Server 中安全模型的核心标识符，用于唯一标记数据库中的用户、角色等安全主体，是权限管理、对象所有权关联的基础。通过 principal_id，可以追踪主体的权限、所属架构、角色成员关系等关键信息。<br/>
    /// 可以查看db中所有的安全主体:
    /// <code>
    /// SELECT 
    ///     principal_id,
    ///     name AS principal_name,
    ///     type_desc AS principal_type  -- 类型：用户、角色等
    /// FROM sys.database_principals
    /// ORDER BY principal_id;
    /// 
    /// -- 结果示例:
    /// principal_id    principal_name      principal_type
    /// 0               public              DATABASE_ROLE
    /// 1               dbo                 SQL_USER
    /// 2               guest               SQL_USER
    /// 3               INFORMATION_SCHEMA  SQL_USER
    /// 4               sys                 SQL_USER
    /// 16384           db_owner            DATABASE_ROLE
    /// 16385           db_accessadmin      DATABASE_ROLE
    /// 16386           db_securityadmin    DATABASE_ROLE
    /// 16387           db_ddladmin         DATABASE_ROLE
    /// 16389           db_backupoperator   DATABASE_ROLE
    /// 16390           db_datareader       DATABASE_ROLE
    /// 16391           db_datawriter       DATABASE_ROLE
    /// 16392           db_denydatareader   DATABASE_ROLE
    /// 16393           db_denydatawriter   DATABASE_ROLE
    /// </code>
    /// </summary>
    public int PrincipalId { get; set; }

    /// <summary>
    /// 表示默认字符集所属的 “目录”（Catalog）名称。在 SQL Server 中，这个值通常为 NULL，因为 SQL Server 的架构体系中不使用 “目录” 来组织字符集，该字段主要是为了兼容 SQL 标准和其他数据库系统（如 MySQL、PostgreSQL 等）的信息架构规范。
    /// </summary>
    public string DEFAULT_CHARACTER_SET_CATALOG { get; set; }
    /// <summary>
    /// 表示默认字符集所属的 “架构”（Schema）名称。与上一列类似，SQL Server 中该值也通常为 NULL，因为字符集在 SQL Server 中是数据库级别的设置，不属于任何特定架构，此字段同样是为了兼容 SQL 标准。
    /// </summary>
    public string DEFAULT_CHARACTER_SET_SCHEMA { get; set; }
    /// <summary>
    /// 表示当前数据库默认使用的字符集名称。在 SQL Server 中，这个值通常对应数据库的 “排序规则”（Collation）中隐含的字符集。例如：
    /// <list type="bullet">
    /// <item>若数据库排序规则为 Chinese_PRC_CI_AS，则字符集为 GBK（简体中文字符集）；</item>
    /// <item>若排序规则为 SQL_Latin1_General_CP1_CI_AS，则字符集为 Latin1（拉丁字符集）。</item>
    /// <item>实测: sqlserver2008(db的排序规则 Chinese_PRC_CI_AS)的 dbo 的为 cp936(和 GBK 一个意思)</item>
    /// <item>实测: sqlserver2022(db的排序规则 SQL_Latin1_General_CP1_CI_AS)的 dbo 的为 iso_1(应该和 Latin1 一个意思)</item>
    /// </list>
    /// </summary>
    public string DEFAULT_CHARACTER_SET_NAME { get; set; }

    /// <summary>
    /// 自制的描述
    /// </summary>
    public string Remark { get; set; }
}
